////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2017 Qualcomm Technologies, Inc.
// All Rights Reserved.
// Confidential and Proprietary - Qualcomm Technologies, Inc.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @file  camxjpegutil.h
/// @brief JPEG util Node class declarations
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef CAMXJPEGUTIL_H
#define CAMXJPEGUTIL_H

#include "camxdefs.h"
#include "camxtypes.h"
#include "camxutils.h"
#include "camxjpeghufftable.h"
#include "camxjpegquanttable.h"
#include "camxmetadatapool.h"
#include "camxhal3metadatatags.h"
#include "camxjpegexifdefs.h"

CAMX_NAMESPACE_BEGIN

static const UINT32 NumHuffTables  = static_cast<UINT32>(HuffTableType::HuffTableMax);
static const UINT32 NumQuantTables = static_cast<UINT32>(QuantTableType::QuantTableMax);
static const UINT32 DefaultQuality = 85;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @brief Class that implements common JPEG utility functions.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class JPEGUtil
{
public:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// SetDefaultQuantizationTables
    ///
    /// @brief  Sets the default quantization tables base on quality
    ///
    /// @param  pQuantizationTables Pointer to quantization table object
    ///
    /// @return return CamxResult
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static CamxResult SetDefaultQuantizationTables(
        JPEGQuantTable* const pQuantizationTables);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// SetDefaultHuffmanTables
    ///
    /// @brief  Sets the default Huffman tables
    ///
    /// @param  pHuffmanTables Pointer to Huffman table object
    ///
    /// @return return CamxResult
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static CamxResult SetDefaultHuffmanTables(
        JPEGHuffTable* const pHuffmanTables);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetUnsignedRational
    ///
    /// @brief  Function to make unsigned rational
    ///
    /// @param  pRational      Pointer to rational
    /// @param  numerator      Numerator
    /// @param  denominator    Denominator
    ///
    /// @return CamxResultSuccess if successful
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static CamxResult GetUnsignedRational(
        URAT32* pRational,
        INT32   numerator,
        INT32   denominator);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetSignedRational
    ///
    /// @brief  Function to make signed rational
    ///
    /// @param  pRational      Pointer to rational
    /// @param  numerator      Numerator
    /// @param  denominator    Denominator
    ///
    /// @return CamxResultSuccess if successful
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static CamxResult GetSignedRational(
        RAT32*  pRational,
        INT32   numerator,
        INT32   denominator);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// UpdateQuantizationTableQuality
    ///
    /// @brief  Update quantization tables with quality
    ///
    /// @param  pQuantizationTables  Pointer to quantization table object
    /// @param  quality              JPEG encode quality
    ///
    /// @return return CamxResult
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static CamxResult UpdateQuantizationTableQuality(
        JPEGQuantTable* pQuantizationTables,
        UINT32          quality);

private:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// JPEGUtil
    ///
    /// @brief  Constructor
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    JPEGUtil();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// ~JPEGUtil
    ///
    /// @brief  Destructor
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ~JPEGUtil();

    JPEGUtil(const JPEGUtil&) = delete;                 ///< Disallow the copy constructor.
    JPEGUtil& operator=(const JPEGUtil&) = delete;      ///< Disallow assignment operator.
};

CAMX_NAMESPACE_END

#endif // CAMXJPEGUTIL_H
